From: Florian Müllner Date: Fri, 14 Sep 2012 15:55:42 +0000 (+0200) Subject: focus-manager: Make groups "refcounted" X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~5859 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=94c1d5a18c60e8ef0827b98fee3084ce7eb671f3;p=gnome-shell.git focus-manager: Make groups "refcounted" Rather than unconditionally removing a focus root in remove_group(), decrement a counter that add_group() increments, and only actually remove a focus root when the counter drops to 0. https://bugzilla.gnome.org/show_bug.cgi?id=682243 --- diff --git a/src/st/st-focus-manager.c b/src/st/st-focus-manager.c index 85acf293b..e12ec4689 100644 --- a/src/st/st-focus-manager.c +++ b/src/st/st-focus-manager.c @@ -180,10 +180,13 @@ void st_focus_manager_add_group (StFocusManager *manager, StWidget *root) { + gpointer count_p = g_hash_table_lookup (manager->priv->groups, root); + int count = count_p ? GPOINTER_TO_INT (count_p) : 0; + g_signal_connect (root, "destroy", G_CALLBACK (remove_destroyed_group), manager); - g_hash_table_insert (manager->priv->groups, root, GINT_TO_POINTER (1)); + g_hash_table_insert (manager->priv->groups, root, GINT_TO_POINTER (++count)); } /** @@ -197,7 +200,15 @@ void st_focus_manager_remove_group (StFocusManager *manager, StWidget *root) { - g_hash_table_remove (manager->priv->groups, root); + gpointer count_p = g_hash_table_lookup (manager->priv->groups, root); + int count = count_p ? GPOINTER_TO_INT (count_p) : 0; + + if (count == 0) + return; + if (count == 1) + g_hash_table_remove (manager->priv->groups, root); + else + g_hash_table_insert (manager->priv->groups, root, GINT_TO_POINTER(--count)); } /**